package com.bb.flow.config;


import com.bb.flow.api.type.ExecuteState;
import com.bb.flow.config.enumtype.NodeType;
import com.bb.flow.config.enumtype.WaitType;

/**
 * @author bigbeard
 * 流程配置节点顶级类
 */
public abstract class AbstractConfigNode {
    /**
     * 节点名称
     */
    private String nodeKey;
    /**
     * 是否首节点
     */
    private boolean startNode = false;
    /**
     * 等待方式
     */
    private WaitType waitType;
    /**
     * 等待时间
     */
    private int waitTime = 0;
    /**
     * 下一个节点
     */
    private String nextNodeKey;
    /**
     * 其他附加信息
     */
    private String otherInfo;

    /**
     * 执行状态
     */
    private ExecuteState executeState;

    public ExecuteState getExecuteState() {
        return executeState;
    }

    public void setExecuteState(ExecuteState executeState) {
        this.executeState = executeState;
    }

    public String getOtherInfo() {
        return otherInfo;
    }

    public void setOtherInfo(String otherInfo) {
        this.otherInfo = otherInfo;
    }


    /**
     * 节点类型
     *
     * @return 节点类型
     */
    public abstract NodeType getNodeType();


    /**
     * 获取节点名称
     *
     * @return 接点名称
     */
    public String getNodeKey() {
        return nodeKey;
    }

    /**
     * 设置节点名称
     *
     * @param nodeKey 接节点名称,流程内唯一,否则会覆盖
     * @return 当前对象
     */
    public AbstractConfigNode setNodeKey(String nodeKey) {
        this.nodeKey = nodeKey;
        return this;
    }

    /**
     * 是否开始节点
     *
     * @return true:开始节点,否则不是
     */
    public boolean isStartNode() {
        return startNode;
    }

    /**
     * 设置是否开始节点
     *
     * @param startNode true:是,否则不是
     * @return 当前对象
     */
    public AbstractConfigNode setStartNode(boolean startNode) {
        this.startNode = startNode;
        return this;
    }

    /**
     * 获取等待方式
     *
     * @return 等待方式
     */
    public WaitType getWaitType() {
        return waitType;
    }

    /**
     * 设置等待方式
     *
     * @param waitType 等待方式
     * @return 当前对象
     */
    public AbstractConfigNode setWaitType(WaitType waitType) {
        this.waitType = waitType;
        return this;
    }

    /**
     * 获取等待时间,单位秒
     *
     * @return 等待时间, 单位秒
     */
    public int getWaitTime() {
        return waitTime;
    }

    /**
     * 设置等待时间
     *
     * @param waitTime 等待时间,单位秒
     * @return 当前对象
     */
    public AbstractConfigNode setWaitTime(int waitTime) {
        this.waitTime = waitTime;
        return this;
    }

    /**
     * 获取下一节点名称
     *
     * @return 下一节点名称
     */
    public String getNextNodeKey() {
        return nextNodeKey;
    }

    /**
     * 设置下一节点名称
     *
     * @param nextNodeKey 下一节点名称
     * @return 当前对象
     */
    public AbstractConfigNode setNextNodeKey(String nextNodeKey) {
        this.nextNodeKey = nextNodeKey;
        return this;
    }
}
